﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Threading;
using System.Diagnostics;
using System.Configuration;
using Microsoft.Win32;

using System.Runtime.InteropServices; // pour DllImport
using System.IO; // pour Directory

namespace ScreenShoter
{
    public partial class FenConfig : Form
    {
        private bool lancé = false;
        private gestionCapture gestCapt = new gestionCapture();
        private Config ConfGen = new Config();
        Configuration fichierConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        KeyHook hookImprEcran = new KeyHook();
        KeyHook hookAltImprEcran = new KeyHook();

        public FenConfig()
        {
            // Si le logiciel est déjà lancé
            if ((Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName.ToString())).Length > 1)
            {
                DialogResult rs = MessageBox.Show("Une instance de l'application est déjà en cours d'exécution.",
                                 "Application déjà lancée",
                                 MessageBoxButtons.OK,
                                 MessageBoxIcon.Error);
                if (rs == DialogResult.OK)
                    Environment.Exit(0);
            }

            InitializeComponent();

            hookImprEcran.KeyPressed += new EventHandler<KeyPressedEventArgs>(screenShotAll);
            hookImprEcran.RegisterHotKey(ModKeys.None, Keys.PrintScreen);

            hookAltImprEcran.KeyPressed += new EventHandler<KeyPressedEventArgs>(screenShotActive);
            hookAltImprEcran.RegisterHotKey(ModKeys.Alt, Keys.PrintScreen);
        }              

        private void masquer_config()
        {
            if (!ConfGen.fenMasquée)
            {
                this.Hide();
                this.IconeNotif.Visible = true;
                ConfGen.fenMasquée = true;
            }
        }

        private void afficher_config()
        {
            if (ConfGen.fenMasquée)
            {
                this.Show();
                this.IconeNotif.Visible = false;
                ConfGen.fenMasquée = false;
            }
        }

        private void testToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.afficher_config();
        }

        private void quitterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Environment.Exit(0);
            Application.Exit();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (fichierConfig.AppSettings.Settings.Count == 0)
            {
                // Si le fichier de configuration est vide, il faut initialiser avec les valeurs par défaut
                ConfGen.path = Directory.GetCurrentDirectory();
                this.PathChoisi.Text = ConfGen.path;
                ConfGen.formatImage = "PNG";
                ConfGen.lancéDémarrage = false;
                ConfGen.masquéLancement = false;
                
                this.cbxFormat.SelectedIndex = 0;

                this.saveConfig();
            }
            else
            {
                // Sinon, On charge les informations dans la classe Config
                this.loadConfig();
            }

            // Si la fenêtre doit être masquée au démarrage, il faut la cacher
            if (ConfGen.masquéLancement)
            {
                // Empêcher le scintillement apparaitre/disparaitre
                this.Opacity = 0;
            }

            // L'icone dans la zone de notification sera la même que celle de l'appli
            this.IconeNotif.Icon = this.Icon;
            this.IconeNotif.Visible = false;
        }

        private void FenConfig_Shown(object sender, EventArgs e)
        {
            if (ConfGen.masquéLancement)
            {
                this.masquer_config();
                this.Opacity = 1;
            }
            this.lancé = true;
        }

        private void IconeNotif_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.afficher_config();
        }

        private void saveConfig()
        {
            fichierConfig.AppSettings.Settings.Clear();
            fichierConfig.AppSettings.Settings.Add("Path", ConfGen.path);
            fichierConfig.AppSettings.Settings.Add("Format Image", ConfGen.formatImage);
            fichierConfig.AppSettings.Settings.Add("Lancé Démarrage", ConfGen.lancéDémarrage.ToString());
            fichierConfig.AppSettings.Settings.Add("Masqué Lancement", ConfGen.masquéLancement.ToString());
            fichierConfig.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSetings");
        }

        private void loadConfig()
        {
            try
            {
                ConfGen.path = ConfigurationManager.AppSettings["Path"].ToString();
                PathChoisi.Text = ConfGen.path;
                ConfGen.formatImage = ConfigurationManager.AppSettings["Format Image"].ToString();
                if (ConfGen.formatImage == "JPEG")
                    this.cbxFormat.SelectedIndex = 1;
                else if (ConfGen.formatImage == "GIF")
                    this.cbxFormat.SelectedIndex = 2;
                else
                    this.cbxFormat.SelectedIndex = 0;

                ConfGen.lancéDémarrage = Convert.ToBoolean(ConfigurationManager.AppSettings["Lancé Démarrage"]);
                chbxLanceWin.Checked = ConfGen.lancéDémarrage;
                ConfGen.masquéLancement = Convert.ToBoolean(ConfigurationManager.AppSettings["Masqué Lancement"]);
                chbxCacherLanc.Checked = ConfGen.masquéLancement;
            }
            catch
            {
                MessageBox.Show("Erreur pendant la lecture du fichier de configuration.\nVeuillez le supprimer et relancer l'application.",
                                 "Erreur lecture configuration",
                                 MessageBoxButtons.OK,
                                 MessageBoxIcon.Error);
                Environment.Exit(0);
            }
        }

        private void screenShotAll(object sender, KeyPressedEventArgs e)
        {
            Bitmap result = gestCapt.Capture(gestionCapture.CaptureMode.Screen);
            gestCapt.ImageSave(result, ConfGen.formatImage, ConfGen.path);
        }

        private void screenShotActive(object sender, KeyPressedEventArgs e)
        {
            Bitmap result = gestCapt.Capture(gestionCapture.CaptureMode.Window);
            gestCapt.ImageSave(result, ConfGen.formatImage, ConfGen.path);
        }

        private void FenConfig_FormClosing(object sender, FormClosingEventArgs e)
        {
            // On désactive les raccourcis claviers programmés
            hookImprEcran.Dispose();
            hookAltImprEcran.Dispose();
        }

        private void BtnParcourrir_Click(object sender, EventArgs e)
        {
            DialogResult result = folderBrowserDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                ConfGen.path = folderBrowserDialog1.SelectedPath.ToString();
                PathChoisi.Text = ConfGen.path;
                this.saveConfig();
            }
        }

        private void btnCacher_Click(object sender, EventArgs e)
        {
            // On masque la fenêtre et on affiche l'icone dans la zone de notif
            this.masquer_config();
        }

        private void cbxFormat_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lancé)
            {
                ConfGen.formatImage = cbxFormat.Text.ToString();
                this.saveConfig();
            }
        }

        private void chbxLanceWin_CheckedChanged(object sender, EventArgs e)
        {
            if (lancé)
            {
                ConfGen.lancéDémarrage = chbxLanceWin.Checked;
                this.saveConfig();

                if (chbxLanceWin.Checked)
                {
                    // On ouvre la clé de registre, en mode écriture
                    RegistryKey registre = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
                    registre.SetValue("ScreenShoter", Application.ExecutablePath);
                }
                else
                {
                    // On veut une suppression
                    RegistryKey registre = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
                    try
                    {
                        registre.DeleteValue("ScreenShoter");
                    }
                    catch
                    {
                        Console.WriteLine("Erreur pendant la suppression de la clé du registre.");
                    }
                }
            }
        }

        private void chbxCacherLanc_CheckedChanged(object sender, EventArgs e)
        {
            if (lancé)
            {
                ConfGen.masquéLancement = chbxCacherLanc.Checked;
                this.saveConfig();
            }
        }
    }
}
